package cn.iocoder.yudao.module.member.service.userwithdraw;

import javax.validation.*;

import cn.iocoder.yudao.module.member.controller.admin.userwithdraw.vo.*;
import cn.iocoder.yudao.module.member.controller.app.userwithdraw.vo.AppUserWithdrawSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.userwithdraw.UserWithdrawDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.springframework.web.multipart.MultipartFile;

/**
 * 提现 Service 接口
 *
 * @author 芋道源码
 */
public interface UserWithdrawService {

    /**
     * 创建提现
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createUserWithdraw(@Valid UserWithdrawSaveReqVO createReqVO);

    /**
     * 创建提现
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createUserWithdrawForApp(@Valid AppUserWithdrawSaveReqVO createReqVO);

    /**
     * 更新提现
     *
     * @param updateReqVO 更新信息
     */
    Boolean updateUserWithdraw(UserWithdrawUpdateReqVO updateReqVO);

    /**
     * 编辑
     *
     * @param id     id
     * @param files  文件
     * @param status 状态
     * @param aliNo  支付宝单号
     * @param remark 备注
     * @return 是否成功
     */
    Boolean updateUserWithdraw(Long id, MultipartFile[] files, Integer status, String aliNo, String remark);

    /**
     * 删除提现
     *
     * @param id 编号
     */
    void deleteUserWithdraw(Long id);

    /**
     * 获得提现
     *
     * @param id 编号
     * @return 提现
     */
    UserWithdrawDO getUserWithdraw(Long id);

    /**
     * 获得提现分页
     *
     * @param pageReqVO 分页查询
     * @return 提现分页
     */
    PageResult<UserWithdrawRespVO> getUserWithdrawPage(UserWithdrawPageReqVO pageReqVO);

    /**
     * 提现总金额，单位：分
     *
     * @param status
     * @return
     */
    Integer totalWithdrawByStatus(Integer status);

    /**
     * 提现总金额，单位：分
     *
     * @param userId
     * @return
     */
    Integer totalWithdrawByUserId(Long userId);

    /**
     * 提现总金额，单位：分
     *
     * @param userId
     * @param status
     * @return
     */
    Integer totalWithdrawByUserIdAndStatus(Long userId, Integer status);

    /**
     * 成功提现总金额，单位：分
     *
     * @param userId
     * @return
     */
    Integer totalWithdrawByUserIdAndStatusSucc(Long userId);

    /**
     * 可提现金额，单位：分
     *
     * @param commission
     * @return
     */
    Integer withdrawAvailable(Integer commission);

    /**
     * 提现统计
     *
     * @return
     */
    UserWithdrawStatisticsRespVO getUserWithdrawStatistics();

}